package com.rule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class MyRule extends AbstractLoadBalancerRule {

    /*
     total = 0 // 当total==5以后，我们指针才能往下走，
     index = 0 // 当前对外提供服务的服务器地址，
     total需要重新置为零，但是已经达到过一个5次，我们的index = 1
     */
    private int total = 0;    // 总共被调用的次数，目前要求每台被调用5次
    private int currentIndex = 0;  // 当前提供服务的机器号
    
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }else {
            Server server = null;

            while(server == null) {
                if (Thread.interrupted()) {
                    return null;
                }

                List<Server> upList = lb.getReachableServers();//获取可用的服务
                List<Server> allList = lb.getAllServers();      //获取所有的服务
                int serverCount = allList.size();               //获取所有服务个数
                if (serverCount == 0) {
                    return null;
                }

                //int index = this.chooseRandomInt(serverCount);
                //server = (Server)upList.get(index);
                //如果一台机器没有被调用5次，继续调用这一台
                if(total < 5)
                {
                    server = upList.get(currentIndex);
                    total++;
                }else {
                    //如果一台机器已经调用了5次，则换下一台进行服务 此时重置当前服务器的调用次数
                    currentIndex++;
                    total = 0;
                    if(currentIndex >= upList.size())
                    {
                        currentIndex = 0;
                    }
                }

                if (server == null) {
                    Thread.yield();
                } else {
                    if (server.isAlive()) {
                        return server;
                    }

                    server = null;
                    Thread.yield();
                }
            }
            return server;
        }
    }


    public Server choose(Object key) {
        return this.choose(this.getLoadBalancer(), key);
    }

    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
}
